home *** CD-ROM | disk | FTP | other *** search
Text File | 1998-04-30 | 7.2 KB | 347 lines | [TEXT/MPS ] |
- /*
- File: OTUdpPitchByNameSample.cp
-
- Contains: UDP pitch sample code
-
- Copyright: © 1993-1997 by Apple Computer, Inc., all rights reserved.
-
- */
-
-
- // OT UDP Pitch Test Program (as an SIOW app)
-
- #include <QuickDraw.h>
- #include <stdio.h>
- #include <StdLib.h>
- #include <TextUtils.h>
- #include <strings.h>
- #include <String.h>
- #include <Events.h>
- #include <Menus.h>
- #include <Devices.h>
- #include <OpenTransport.h>
- #include <OpenTptInternet.h>
-
-
- /*******************************************************************************
- ** GLOBAL VARIABLES
- ********************************************************************************/
-
- #define kMaxDataLen 256
-
- const size_t kMyPoolSize = 60000;
-
- InetPort gPitchPort=0;
-
- unsigned long gNoOfTimes=0;
- unsigned short gBindCompleted = 0;
-
- OTEventCode gCode;
- TEndpoint* gCookie;
- OSErr gErr;
-
- char theAddr[255];
- DNSAddress* hisAddr = (DNSAddress*)theAddr;
-
- struct InetAddress reqsin, retsin;
- char data[kMaxDataLen];
- char defaultData[] = "Go Cal, beat Stanford !!!";
-
-
- /*******************************************************************************
- ** Function Prototypes
- ********************************************************************************/
-
- void Inits();
- void CleanUp();
- void Idle();
- void DoIt();
- OSErr DoStaticBind(TEndpoint* ep);
- OSErr DoSend(TEndpoint* ep);
-
-
- /*******************************************************************************
- ** main function
- ********************************************************************************/
-
- void main(int, char**)
- {
- Inits();
- DoIt();
- CleanUp();
- }
-
- /*******************************************************************************
- ** Initialize Quickdraw and ASLM
- ********************************************************************************/
-
- void Inits()
- {
- InitGraf(&qd.thePort);
- if (InitOpenTransport() != kOTNoError)
- {
- fprintf(stderr, "OTUdpPitch: Could not initialize ASLM, exiting\n");
- exit(1);
- }
- }
-
- /*******************************************************************************
- ** Clean up at the end
- ********************************************************************************/
-
- void CleanUp()
- {
- CloseOpenTransport();
- }
-
- /*******************************************************************************
- ** Idle
- ********************************************************************************/
-
- void Idle()
- {
- SystemTask();
- }
-
- /*******************************************************************************
- ** EventHandler
- ********************************************************************************/
-
- pascal void EventHandler(void*, OTEventCode event, OTResult result,
- void* cookie)
- {
- if (event == T_BINDCOMPLETE)
- {
- gBindCompleted = 1;
- }
- else if (event == T_OPENCOMPLETE)
- {
- gErr = (OSErr) result;
- gCookie = (TEndpoint*) cookie;
- gCode = event;
- }
- return;
- }
-
- /*******************************************************************************
- ** DoIt
- ********************************************************************************/
-
- void DoIt()
- {
- TEndpoint* ep = NULL;
- TEndpointInfo info;
- OSErr err=0;
- long myport=0;
- InetHost myaddr=0;
- char mystr[255];
-
- myport = 0;
- fprintf(stderr, "What UDP port should I use to send data ? (enter UDP port number)\n");
- if (gets(mystr) != 0)
- {
- stringtonum(mystr, &myport);
- gPitchPort =(InetPort) myport;
- }
- else
- {
- fprintf(stderr, "Couldn't get source port from window!\n");
- return;
- }
-
- OTInitInetAddress(&reqsin, gPitchPort, (InetHost) 0);
-
- fprintf(stderr, "Enter the target as name:port\n");
- if (gets(hisAddr->fName) != 0)
- {
- hisAddr->fAddressType = AF_DNS;
- }
- else
- {
- fprintf(stderr, "Couldn't get target address and port from window!\n");
- return;
- }
-
- fprintf(stderr, "What should I send ? (enter data string)\n");
- if (gets(data) == 0) {
- strcpy(data, defaultData);
- fprintf(stderr, "sending default data: <%s>\n", data);
- }
- data[strlen(data)] = '\n';
-
- fprintf(stderr, "How many times should I send this data ?\n");
- if (gets(mystr) != 0) {
- stringtonum(mystr, &myport);
- gNoOfTimes = (unsigned short) myport;
- }
- else
- {
- fprintf(stderr, "Couldn't get number to send from window!\n");
- return;
- }
-
- fprintf(stderr, "The program will send <%d> packets to <%s>\n", gNoOfTimes, hisAddr->fName);
-
- do
- {
- //
- // Now create a UDP
- //
- gCode = 0;
- gCookie = NULL;
- gErr = 0;
- err = OTAsyncOpenEndpoint(OTCreateConfiguration(kUDPName), 0, &info, EventHandler, 0);
- if ( err == kOTNoError )
- {
- while ( gCode == 0 )
- OTIdle();
- err = gErr;
- }
- if ( err != kOTNoError )
- {
- ep = NULL;
- fprintf(stderr,"ERROR: OpenEndpoint(\"UDP\") failed with %d\n", err);
- break;
- }
- else
- {
- ep = gCookie;
- }
- #ifdef O
- //
- // Install notifier we're going to use for testing
- //
- err = ep->InstallNotifier(&EventHandler, 0);
- if ( err != kOTNoError )
- {
- fprintf(stderr, "ERROR: InstallNotifier() failed with %d\n", err);
- break;
- }
- #endif
- //
- // Try to bind
- //
- ep->SetAsynchronous();
- err = DoStaticBind(ep);
- if ( err != kOTNoError )
- break;
-
- ep->SetSynchronous();
-
- while (gNoOfTimes--)
- {
- err = DoSend(ep);
- if ( err != kOTNoError )
- break;
- Idle();
- }
- //
- // Try to Unbind
- //
- err = ep->Unbind();
- if ( err != kOTNoError )
- {
- fprintf(stderr, "ERROR: Unbind() returned %d\n", err);
- break;
- }
- } while (false);
-
- if (ep)
- {
- //
- // Remove notifier
- //
- ep->RemoveNotifier();
- //
- // Get rid of endpoint.
- //
- err = ep->Close();
- if ( err != kOTNoError )
- {
- fprintf(stderr, "ERROR: CloseEndpoint() failed with %d\n", err);
- }
- }
- fprintf(stderr, "Bye\n");
- }
-
- /*******************************************************************************
- ** DoStaticBind
- ********************************************************************************/
-
- OSErr DoStaticBind(TEndpoint* ep)
- {
- TBind req, ret;
- OSErr err=0;
-
- // bind udp to current address and port
- req.addr.len = sizeof(struct InetAddress);
- req.addr.buf = (unsigned char *) &reqsin;
- req.qlen = 1; // don't care for udp
- ret.addr.maxlen = sizeof(struct InetAddress);
- ret.addr.buf = (unsigned char *) &retsin;
-
- err = ep->Bind(&req, &ret);
- if ( err != kOTNoError )
- {
- fprintf(stderr, "Static Bind returns %d\n", err);
- return err;
- }
- while (gBindCompleted == 0)
- {
- }
- gBindCompleted = 0;
- return ( err != kOTNoError );
- }
-
- /*******************************************************************************
- ** DoSend
- ********************************************************************************/
-
- OSErr DoSend(TEndpoint* ep)
- {
- OSErr err;
- OTResult res;
- TUnitData unitdata;
-
- // Send a UDP datagram
-
- unitdata.addr.len = sizeof(OTAddressType) + strlen(hisAddr->fName);
- unitdata.addr.buf = (UInt8*)hisAddr;
- unitdata.opt.len = 0;
- unitdata.opt.buf = 0;
- unitdata.udata.len = strlen(data);
- unitdata.udata.buf = (unsigned char *) data;
-
- err = ep->SndUData( &unitdata);
-
- if ( err != kOTNoError )
- {
- if (err == kOTLookErr)
- {
- res = ep->Look();
- switch (res)
- {
- case T_LISTEN:
- case T_CONNECT:
- case T_DATA:
- case T_EXDATA:
- case T_DISCONNECT:
- case T_UDERR:
- case T_ORDREL:
- case T_GODATA:
- case T_GOEXDATA:
- default:
- fprintf(stderr, "t_look returns %d\n", res);
- break;
- }
- }
- else
- fprintf(stderr, "SndUData() returns %d\n", err);
- }
- else
- {
- fprintf(stderr, "Sent <%s> to <%s>\n", data, hisAddr->fName);
- }
- return err;
- }
-